home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagg_m.zip / KEYBOARD.SWG / 0067_Intercept Ctrl-Alt-Del.pas < prev    next >
Pascal/Delphi Source File  |  1994-01-27  |  3KB  |  138 lines

  1. {
  2. From: COLIN CYR
  3. Subj: Ctrl-Alt-Del...
  4. }
  5.  
  6. UNIT CADThief;
  7.  
  8. {Intercept Control+Alternate+Delete keypresses}
  9.  
  10. INTERFACE
  11.  
  12. USES Crt,Dos;
  13.  
  14. FUNCTION GetCAD   : boolean;
  15. FUNCTION HandleCADs: boolean;
  16.  
  17. IMPLEMENTATION
  18.  
  19. VAR
  20.    OldInt09,OldExitProc: pointer;
  21.    KeyStat: ^byte;
  22.    CADStatus: boolean;
  23.  
  24. PROCEDURE GoOldInt(OldIntVector: pointer);
  25. INLINE(
  26.    $5B/    {POP BX - Get Segment}
  27.    $58/    {POP AX - Get Offset}
  28.    $89/    {MOV SP,BP}
  29.    $EC/
  30.    $5D/    {POP BP}
  31.    $07/    {POP ES}
  32.    $1F/    {POP DS}
  33.    $5F/    {POP DI}
  34.    $5E/    {POP SI}
  35.    $5A/    {POP DX}
  36.    $59/    {POP CX}
  37.    $87/    {XCHG SP,BP}
  38.    $EC/
  39.    $87/    {XCHG [BP],BX}
  40.    $5E/
  41.    $00/
  42.    $87/    {XCHG [BP+2],AX}
  43.    $46/
  44.    $02/
  45.    $87/    {XCHG SP,BP}
  46.    $EC/
  47.    $CB);   {RETF}
  48.  
  49. PROCEDURE SetCAD(Status: boolean);
  50.   BEGIN
  51.     CADStatus := Status     {Set flag}
  52.   END;
  53.  
  54. FUNCTION GetCAD: boolean;
  55.   BEGIN
  56.     GetCAD := CADStatus;
  57.   END;
  58.  
  59. {$F+}
  60. PROCEDURE NewExitProc;
  61. {$F-}
  62.  BEGIN
  63.    ExitProc := OldExitProc;
  64.    SetIntVec($09,OldInt09);
  65.    CheckBreak := TRUE
  66.  END;
  67.  
  68. {$F+}
  69. PROCEDURE NewInt09(AX,BX,CX,DX,SI,DI,DS,ES,BP: Word); INTERRUPT;
  70. {$F-}
  71.  VAR
  72.    I,J : integer;
  73.  CONST
  74.    KsDelCode = $53;
  75.  BEGIN
  76.    I := Port[$60];                   {Get Scan Code}
  77.    if ((I and $7F) = KsDelCode) and  {DEL key?}
  78.      ((KeyStat^ and $0C) = $0C)      {CTL + ALT ?}
  79.      THEN
  80.    BEGIN
  81.      SetCAD(TRUE);
  82.      J := Port[$61];         {Save Kbd Status}
  83.      Port[$61] := J and $80; {Reset Kbd Int}
  84.      Port[$61] := J and $7F;
  85.      Port[$20] := $20;
  86.      Sound(880);Delay(100);Sound(1220);Delay(250);NoSound;
  87.    END
  88.       ELSE
  89.    GoOldInt(OldInt09)
  90.  END;
  91.  
  92. FUNCTION HandleCADs: boolean;
  93.  
  94. VAR
  95.    XPos,YPos: byte;
  96.    A : char;
  97.    Regs : Registers;
  98.  
  99. BEGIN
  100.   WITH Regs DO   {Flush keyboard buffer}
  101.     BEGIN
  102.       AH := $0C;
  103.       AL := 0;
  104.       MsDOS(Regs)
  105.     END;
  106.   XPos :=WhereX;      {Save old cursor position}
  107.   YPos := WhereY;
  108.   GotoXY(1,1);
  109.   WriteLn('Ctrl+Alt+Del pressed');
  110.   Delay(250);Sound(1600);Delay(250);NoSound;
  111.   GotoXY(1,1);WriteLn('                    ');
  112.   GotoXY(1,1);Write('Are you sure you want to quit? ');
  113.   A := ReadKey;Write(A);
  114.   GotoXY(1,1);Write('                                ');
  115.   IF UpCase(A) = 'Y' THEN
  116.      HandleCADs := TRUE
  117.   ELSE
  118.      HandleCADs := FALSE;
  119.   GotoXY(XPos,YPos);SetCAD(FALSE)
  120. END;
  121.  
  122. PROCEDURE InstallCADHndlr;
  123.  
  124.   BEGIN
  125.     OldExitProc := ExitProc;
  126.     ExitProc := @NewExitProc;
  127.     GetIntVec($09,OldInt09);
  128.     SetIntVec($09,@NewInt09);
  129.     SetCBreak(FALSE);
  130.     CheckBreak := FALSE;
  131.     KeyStat := Ptr($40,$17);
  132.   END;
  133.  
  134. BEGIN
  135.   InstallCADHndlr;
  136.   SetCAD(FALSE)
  137. END.
  138.